#ifndef DECODER_H
#define DECODER_H

#include <QObject>

#include "../RScode/source/GF/gf.h"

class Decoder : public QObject
{
  Q_OBJECT

private:
  qlonglong m_n;  // степень кодового слова
  qlonglong m_k;  // степень информационного полинома
  qlonglong m_q;  // мощность поля
  qlonglong m_r;  // степень генераторного полинома
  qlonglong m_d;  // конструктивное расстояние кода
  qlonglong m_t;  // корректирующая способность кода
  GF        m_gf; // поле

  QVector<qlonglong> m_g; // генераторный полином

  // !!!!!!!!!!!!! нужно расставить const где нужно
#ifdef TEST
public:
#else
protected:
#endif
  // вычисление синдрома
  QVector<qlonglong> syndrome(const QVector<qlonglong> b);
  // нахождение полинома локаторов ошибок и полинома величин искажений
  QVector<qlonglong> euclideanAlgorithm(QVector<qlonglong> syndrome,
                                        QVector<qlonglong> &valErrorsPoly);
  // вычисление локаторов ошибок
  QVector<qlonglong> chienSearch(QVector<qlonglong> locatorPoly);
  // вычисление значений ошибок
  QVector<qlonglong> forneyAlgorithm(QVector<qlonglong> valErrorsPoly,
                                     QVector<qlonglong> derivLocatorPoly,
                                     QVector<qlonglong> locators);
  // исправление ошибок
  QVector<qlonglong> errorCorrection(QVector<qlonglong> b,
                                     QVector<qlonglong> locators,
                                     QVector<qlonglong> errors);

public:
  explicit Decoder(qlonglong n, qlonglong k, QObject *parent = 0);
  // декодировать
  QVector<qlonglong> decode(QVector<qlonglong> b);

};

#endif // DECODER_H
